package cn.eonshine.cuba.inf.modular.security.server;

import java.io.IOException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.util.Date;

import cn.eonshine.cuba.inf.common.http.Message;

/**
 * 接口相关加密算法
 * @author lanjf2000
 *
 */
public interface IKeyService {
	
	/**
	 * 获取服务端的Http根目录
	 * @return
	 */
	public String getServerHttpRoot();

	/**
	 * 获取私钥证书全路径
	 * 
	 * @return
	 */
	public String getLocalPriKeyFilePath();
	/**
	 * 获取公钥证书全路径
	 * 
	 * @return
	 */
	public String getLocalPubKeyFilePath();

	/**
	 * 获取公钥base64编码
	 * 
	 * @return
	 * @throws UnrecoverableKeyException
	 * @throws KeyStoreException
	 * @throws NoSuchAlgorithmException
	 * @throws CertificateException
	 * @throws IOException
	 */
	public String getLocalPubKeyBase64() throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException,
			CertificateException, IOException;

	/**
	 * 获取证书私钥 base64 编码
	 * 
	 * @return
	 * @throws KeyStoreException
	 * @throws NoSuchAlgorithmException
	 * @throws CertificateException
	 * @throws IOException
	 * @throws UnrecoverableKeyException
	 */
	public String getLocalPriKeyBase64() throws KeyStoreException, NoSuchAlgorithmException, CertificateException,
			IOException, UnrecoverableKeyException;
	

	/**
	 * 
	 * 服务端调用，将业务数据进行加密，加密后得到的数组进行base64转码，转码后的数据用于网络传输，反馈给客户端。
	 * @param json 业务数据对象，通过JSONUtil.toJsonStr(object)工具，将数据转换成json字符串
	 * @param clientPubKey 客户端传输给服务端的未加密的原始公钥字符串
	 * @return
	 */
	public String getServerEncryptInfo(String json, String clientPubKey);
	
	/**
	 * 服务端调用，将加密的参数数据，解密成明文后，反馈明文数据。
	 * @param encryptContent 接收到客户端发送给服务端的加密密文,需要用本地的私钥解密后读取。
	 * @return
	 */
	public String getServerDecryptInfo(String encryptContent)  throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException;

	
	/**
	 * <pre>
	 * 服务器端调用，整合了数据接收公钥的解密，和反馈给客户端数据的加密程序逻辑过程。
	 * 1、解码客户端公钥
	 * 2、服务端查询数据(通过第一个参数json传递明文数据)
	 * 3、将数据用客户端公钥进行加密
	 * 4、设置Message对象，并将数据反馈给客户端
	 * </pre>
	 * @param json 业务数据对象，明文数据。通过JSONUtil.toJsonStr(object)工具，将数据转换成json字符串
	 * @param count 传入服务器端查询数据的总数(条)
	 * @param encryptClientPubKey 客户端通过网络传输给服务端的公钥字符串，该字符串已经被服务器端的公钥加密过后，用base64转码后，通过网络传输。
	 * @return
	 */
	public Message serverEncryptData(String json, long count, String encryptClientPubKey);
	
	/**
	 * 服务端调用，服务端将客户端发送过来的数据，进行解码处理，后续过程由业务类处理。
	 * @param status 客户端Message传过来的status，冗余参数。作为未来扩展的数据。反馈时，将Status值原样设置。
	 * @param encryptJson 被服务端公钥加密过的信息
	 * @param encryptClientPubKey 被服务端公钥加密过的客户端公钥
	 * @return
	 */
	public Message serverDecrypteData(String status, String encryptJson, String encryptClientPubKey);
	
//=============================================================================================================================	
//			以下属于客户端调用代码
//=============================================================================================================================
	/**
	 * 客户端调用，请求服务端的公钥信息
	 * @return
	 */
	public Message requestServerPubKey();
	
	/**
	 * <pre>
	 * 请求数据
	 * 1、请求服务端的公钥信息
	 * 2、用服务端公钥 对 客户端的公钥 进行加密，加密后的数据作为参数，传递给服务端。
	 * 3、获取服务器端反馈的信息(需要判断数据量)
	 * 4、对数据msg进行解密
	 * 5、反馈解码后的明文数据，等待后续数据入库以及日志记录等业务操作
	 * </pre>
	 * @param url 服务端，请求数据的地址
	 * @param clientContent 客户端向服务端Post发送的明文的字符串。可以是JSON字符串，也可以试单独的字符串，由各个接口自己定义。
	 * 如果是null值，则不发送参数.方法中将会对明文的字符串数据进行加密后再传输
	 * @return
	 */
	public Message clientRequestDataList(String url, String clientContent);
	/**
	 * 时间转换
	 * yyyy-MM-dd'T'HH:mm:ss Z
	 */
	public  Date timeConversion(String dateStr) ;
		
}